package org.acm.seguin.awt; import java.awt.Dimension; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.ListCellRenderer; import javax.swing.event.ListDataListener; public class OrderableList extends JPanel { private OrderableListModel olm; public OrderableList(Object[] data, ListCellRenderer render) { setLayout(null); olm = new OrderableListModel(); olm.setData(data); JList list = new JList(olm); olm.setList(list); if (render != null) list.setCellRenderer(render); Dimension dim = list.getPreferredSize(); list.setSize(dim); list.setLocation(10, 10); add(list); JButton upButton = new JButton("Up"); upButton.addActionListener(new MoveItemAdapter(olm, list, -1)); Dimension buttonSize = upButton.getPreferredSize(); upButton.setSize(buttonSize); int top = Math.max(10, 10 + dim.height / 2 - 3 * buttonSize.height / 2); int bottom = top + buttonSize.height; upButton.setLocation(dim.width + 20, top); add(upButton); JButton downButton = new JButton("Down"); downButton.addActionListener(new MoveItemAdapter(olm, list, 1)); buttonSize = downButton.getPreferredSize(); downButton.setSize(buttonSize); upButton.setSize(buttonSize); top = Math.max(bottom + 10, 10 + dim.height / 2 + buttonSize.height / 2); bottom = top + buttonSize.height; downButton.setLocation(dim.width + 20, top); add(downButton); Dimension panelSize = new Dimension( 30 + dim.width + buttonSize.width, Math.max(10 + bottom, 20 + dim.height)); setPreferredSize(panelSize); list.setLocation(10, (panelSize.height - dim.height) / 2); } public static void main(String[] args) { JFrame frame = new JFrame(); Object[] data = {"one", "two", "three"}; frame.getContentPane().add(new OrderableList(data, null)); frame.pack(); frame.show(); } /** Gets the correctly ordered data */ public Object[] getData() { return olm.getData(); } public void addListDataListener(ListDataListener l) { olm.addListDataListener(l); } public void removeListDataListener(ListDataListener l) { olm.removeListDataListener(l); } }